package cn.iocoder.devlop.module.annual.report.utils;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.extra.spring.SpringUtil;
import cn.iocoder.devlop.module.annual.report.common.dal.dataobject.UpdateInfoDO;
import cn.iocoder.devlop.module.annual.report.common.service.UpdateInfoService;

import java.lang.reflect.Field;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;

public class ObjectComparisonUtil {

    public static List<UpdateInfoDO> compareObjects(Object oldObject, Object newObject ,String ancheid) {
        UpdateInfoService updateInfoService = SpringUtil.getBean(UpdateInfoService.class);

        List<UpdateInfoDO> updateInfos = new ArrayList<>();

        // 确保两个对象都不为null，并且是相同类型的
        if (oldObject == null || newObject == null || !oldObject.getClass().equals(newObject.getClass())) {
            throw new IllegalArgumentException("需要类型一致并且都不为空");
        }

        Class<?> clazz = oldObject.getClass();
        Field[] fields = clazz.getDeclaredFields();

        for (Field field : fields) {
            field.setAccessible(true); // 设置私有字段可访问
            try {
                Object oldValue = field.get(oldObject);
                Object newValue = field.get(newObject);
                if (ObjectUtil.notEqual(oldValue,newValue)) {
                    UpdateInfoDO updateInfoDO = new UpdateInfoDO();
                    updateInfoDO.setAncheid(ancheid);
                    updateInfoDO.setAncheuid(StrUtil.uuid());
                    updateInfoDO.setAlitem(field.getName());
                    updateInfoDO.setAltbe(StrUtil.toStringOrNull(oldValue));
                    updateInfoDO.setAltaf(StrUtil.toStringOrNull(newValue));
                    updateInfoDO.setAltdate(LocalDate.now());
                    updateInfos.add(updateInfoDO);
                }
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
        updateInfoService.savaUpdateInfoByList(updateInfos);
        return updateInfos;
    }

    public static<T> UpdateInfoDO compareObjectList(List<T> oldObjects, List<T> newObjects , String ancheid , String modelName) {
        UpdateInfoService updateInfoService = (UpdateInfoService) SpringUtil.getBean(UpdateInfoService.class);
        UpdateInfoDO updateInfoDO = new UpdateInfoDO();
        if (CollUtil.isNotEmpty(oldObjects) && CollUtil.isNotEmpty(newObjects)) {
            updateInfoDO.setAncheuid(StrUtil.uuid());
            updateInfoDO.setAncheid(ancheid);
            updateInfoDO.setAlitem(modelName);
            updateInfoDO.setAltbe(oldObjects.toString());
            updateInfoDO.setAltaf(newObjects.toString());
            updateInfoDO.setAltdate(LocalDate.now());
        } else if (CollUtil.isNotEmpty(oldObjects) && CollUtil.isEmpty(newObjects)) {
            updateInfoDO.setAncheuid(StrUtil.uuid());
            updateInfoDO.setAncheid(ancheid);
            updateInfoDO.setAlitem(modelName);
            updateInfoDO.setAltbe(oldObjects.toString());
            updateInfoDO.setAltaf(newObjects.toString());
            updateInfoDO.setAltdate(LocalDate.now());
        } else if (CollUtil.isNotEmpty(newObjects) && CollUtil.isEmpty(oldObjects)) {
            updateInfoDO = new UpdateInfoDO();
            updateInfoDO.setAncheuid(StrUtil.uuid());
            updateInfoDO.setAncheid(ancheid);
            updateInfoDO.setAlitem(modelName);
            updateInfoDO.setAltbe(oldObjects.toString());
            updateInfoDO.setAltaf(newObjects.toString());
            updateInfoDO.setAltdate(LocalDate.now());
        } else {
            updateInfoDO = null;
        }
        if (ObjUtil.isNotEmpty(updateInfoDO)){
            updateInfoService.savaUpdateInfo(updateInfoDO);
        }
        return updateInfoDO;
    }
}
